﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Biblioteca.Interfaces;
using System.Data;

namespace Biblioteca.Models
{
    public class ReservasModel : IReserva
    {
        private BibliotecaStore db;

        public ReservasModel(BibliotecaStore data)
        {
            this.db = data;
        }

        public void crearReserva(Reserva reserva)
        {
            db.Reservas.AddObject(reserva);
            db.SaveChanges();
        }

        public void cancelarReserva(Reserva reserva)
        {

            db.ObjectStateManager.ChangeObjectState(reserva, EntityState.Modified);
            db.SaveChanges();
        }

        public int obtenerReservasActivasUsuario(int usuario)
        {
            return this.db.Reservas.Where(m => m.Usuario == usuario).Where(m => m.Estado != 3).Count();
        }

        public int obtenerReservaMaterialUsuario(int id, int usuario)
        {
            return this.db.Reservas.Where(m => m.Material == id).Where(m => m.Usuario == usuario).Where(m => m.Estado != 3).Count();
        }

        public Reserva getSingle(int id)
        {
            return this.db.Reservas.Single(m => m.IdReserva == id);
        }


        public IList<Reserva> obtenerReservasActivas(int id)
        {
            return this.db.Reservas.Where(m => m.Material == id).Where(m => m.Estado == 2).OrderBy(m => m.FechaPedido).ToList(); 
        }


        public IList<Reserva> historialReservasUsuario(int idUsuario)
        {
           return  this.db.Reservas.Where(m => m.Usuario == idUsuario).ToList();
        }


        public int obtenerReservaDisponibilidadUsuarioMaterial(int idMaterial, int disponibilidad, int idUsuario)
        {
            return this.db.Reservas.Where(m => m.Estado == 2).Where(m => m.Material == idMaterial).Take(disponibilidad).Where(m => m.Usuario == idUsuario).Count();
             
        }


        public Reserva obtenerPrimerReservaDisponibilidad(int idMaterial, int disponibilidad, int idUsuario)
        {
            return this.db.Reservas.Where(m => m.Estado == 2).Where(m => m.Material == idMaterial).Take(disponibilidad).Where(m => m.Usuario == idUsuario).First();
        }
    }
}